package com.spring.nio.netty;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.nio.NioSocketChannel;

import java.util.Optional;

/**
 * @author : pangfuzhong
 * @description
 * @date : 2021/8/10 11:37
 */
public class GlobalChannelInitializer extends ChannelInitializer<NioSocketChannel> {
    /** ---> 初始化每一个NioSocketChannnel
     *
     * Netty自适应缓存分配器 AdaptiveRecvByteBufAllocator: 内部持有数组大小为53个元素的内存分配值，值按照如下规格进行
     *
     *  [0~512B]: 16 32 48 64 80 96 ... 每次增加16B进行步进直到496
     *
     *  [512B ~ 1G(1073741824)]: 512 1024 2048 4096 8192 16384 32768 65536 ... 从512B开始每次2倍增长，直到1G
     *
     *      NioSocketChannel默认从1024B开始分配，如果服务端接收到客户端发送的数据超过1024初始缓冲区缓存容量，则只读取1024B，此时会进行判断是否还有数据可读，如果有，重新开辟
     *
     *    ByteBuf进行分配，此时将开辟下一个内存段位，即分配16384为单位的ByteBuf(从源码看每次从SIZE_TABLE中index索引+4进行分配)
     *
     *    总结，每次发送给netty服务端的数据量进行不要超过1024B，否则会重新分配ByteBuf
     *
     * */
    @Override
    protected void initChannel(NioSocketChannel ch) throws Exception {
        // 定制流控策略
        ch.config().setReceiveBufferSize(1024);//TODO --> 接收缓冲区大小，设置Socket接收缓冲区
        ch.config().setSendBufferSize(1024);//TODO --> 发送缓冲区大小，设置Socket接收缓冲区
        ch.config().setWriteBufferLowWaterMark(100); //TODO --> 控制写：
        ch.config().setWriteBufferHighWaterMark(1024);//TODO --> 控制写: 水位高于50B不能写
        this.requestRouteDispatcher(ch);
    }

    private void requestRouteDispatcher(NioSocketChannel ch) {
        ch.pipeline().addLast("frameCoreHandler", null);
    }
}

